/**
 * 深拷贝  深拷贝解决的是 公用内存地址所导致的数据错乱问题
 * 
 * 思路：
 *  1.递归
 *  2.判断类型
 *  3.检查环（也叫循环引用）
 *  4.需要忽略原型
 */

  function deepClone(obj, map = new WeakMap()) {
    if (obj instanceof RegExp) return new RegExp(obj)
    if (obj instanceof Date) return new Date(obj)

    if (obj == null || typeof obj != 'object') return obj
    if (map.has(obj)) {
      return map.get(obj)
    }
    // new一个obj的构造函数
    let t = new obj.constructor()
    map.set(obj, t)
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        t[key] = deepClone(obj[key], map)
      }
    }
    return t
  }

  //测试用例
let obj = {
  a: 1,
  b: {
      c: 2,
      d: 3
  },
  d: new RegExp(/^\s+|\s$/g)
}

let clone_obj = deepClone(obj)
obj.d = /^\s|[0-9]+$/g
console.log(clone_obj)
console.log(obj)